/* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*
* Quotek - Sterownik Pompy Ciepla, Projekt DIY
* http://www.quotek.pl
*
* Copyright (C) 2012-2013 Piotr Murawski
*
* Niniejszy program jest wolnym oprogramowaniem; mozesz go
* rozprowadzac dalej i/lub modyfikowac na warunkach Powszechnej
* Licencji Publicznej GNU, wydanej przez Fundacje Wolnego
* Oprogramowania - wedlug wersji 3-ciej tej Licencji lub kt�rejs
* z pozniejszych wersji.
*
* Niniejszy program rozpowszechniany jest z nadzieja iz bedzie on
* uzyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyslnej
* gwarancji PRZYDATNOSCI HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH
* ZASTOSOWAN. W celu uzyskania blizszych informacji - Powszechna
* Licencja Publiczna GNU.
*
* Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz
* Powszechnej Licencji Publicznej GNU (GNU General Public License);
* jesli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
* Cambridge, MA 02139, USA.
*
* Powszechna Licencja GNU znajduje sie w zalaczonym pliku:
* Licencja.txt
*
* Powszechna Licencja GNU dostepna jest rowniez na stronie:
* http://www.gnu.org/licenses/licenses.html
*
*
* nieoficjalne polskie tlumaczenie na
* http://www.gnu.org.pl
*
* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*
* Quotek - Heat Pump Controller (DIY)
* http://www.quotek.pl
*
* Copyright (C) 2012 Piotr Murawski
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/



#include <fcntl.h>
#include <termios.h>
#include <netinet/in.h>

#include <stdio.h>
#include <libxml/xmlreader.h>

#include "top.h"
#include "config_struct.h"
#include "program_struct.h"
#include "temperatury_definicje.h"
#include "temperatury.h"
#include "krzywe_struct.h"
#include "krzywa.h"




/* ZAPKRZ_ZapiszKrzywe
 *
 */
int ZAPKRZ_ZapiszKrzywe(TKrzywe* pkrzywe, FILE *stream, int noComment)
{
      int i,j;
      TKrzKrzywa   pKrzy[KRZY_MAXDEFINICJIKRZYWYCH];

      for(i=0; i< KRZY_PORCJI; i++){
    	  memcpy(&pKrzy[i*KRZY_MAXKRZYWYCH], pkrzywe[i].krzywa, sizeof(TKrzKrzywa)*KRZY_MAXKRZYWYCH);
      }

      fprintf(stream,"\r\n");
      if(!noComment){
          fprintf(stream,
              "   <!--\r\n"
              "   Definicje krzywych grzania. Kazda krzywa posiada dwa atrybuty obowiazkowe: \r\n"
              "     \"numer\" okresla numer krzywej, maksymalnie %d krzywych \r\n"
              "     \"opis\"  opis tekstowy, maksymalnie %d znakow\r\n"
              "   I jeden opcjonalny\r\n"
              "     \"program\" numer skojarzonego programu\r\n"
              "     \r\n"
              "      <krzywa numer=\"<numer>\" opis=\"<opis>\"  program=\"<program>\">\n"
              "        . . . \r\n"
              "      </krzywa>\n"
              "   Krzywe posiadajace przypisany program, beda aktywne tylko kiedy ten \r\n"
              "   program jest aktywny. Tak wiec, mozna zdefiniowac klika krzywych o tym \r\n"
              "   samym numerze ale innym programie skojarzonym.\r\n"
              "   \r\n"
              "   Sterownik moze miec do 6 aktywnych krzywych, czyli atrybut \"numer\" moze\r\n"
              "   miec wartosc 1..6. Maksymalnie, moze zdefiniowac 12 krzywych.\r\n"
              "   \r\n"
              "   Wewnatrz definicji tego elementu moga znajdowac sie:\r\n"
              "   1) Definicja temperatury wejsciowej, jako srednia wazona dowolnych \r\n"
              "      temperatur. Do kazdej temperatury dodawany jest offset, a nastepnie   \r\n"
              "      mnozona jest przez wspoczynnik. Maksymalnie %d temperatur. Np:\r\n"
              "   \r\n"
              "      <temperaturywej offset=\"3.5\"> \r\n"
              "         <temperaturawej tempid=\"reg1\" mnoznik=\"0.5\" offset=\"0\" />\r\n"
              "      </temperaturywej> \r\n"
              "   \r\n"
              "      atrybut \"offset\" w elemencie \"temperaturywej\" dodawany jest na koncu, po wszystkich\r\n"
              "      temperaturach. Atrybut ten jest opcjonalny\r\n"
              "   \r\n"
              "   2) Punkty krzywej. Tempratura wejsciowa, przechodzi przez funkcje krzywej \r\n"
              "      zdefiniowanej jako zbior punktow. Kazdy punkt zdefiniowany jest jako X-Y, gdzie X \r\n"
              "      to temperatura wejsciowa a Y wyjsciowa. Maksymalnie %d punktow.\r\n"
              "      Dla temperatur ponizej pierwszego punktu i powyzej ostatniego przyjmowane sa wartosci\r\n"
              "      Y pierwszego i odpowiednio ostaniego punktu. Np:\r\n"
              "   \r\n"
              "      <funkcja> \r\n"
              "         <punkt  tempwej=\"-15\" tempwyj=\"45\" /> \r\n"
              "         <punkt  tempwej=\"-5\"  tempwyj=\"30\" /> \r\n"
              "         <punkt  tempwej=\"20\"  tempwyj=\"10\" /> \r\n"
              "         <punkt  tempwej=\"22\"  tempwyj=\"5\"  /> \r\n"
              "      </funkcja> \r\n"
              "   \r\n"
              "   3) Korekcji wyjsciowej. Jest modyfikacja umozwliwiajaca przesuniecie krzywej \r\n"
              "      w pionie w zaleznosci od wazonej sumy maksymalnie %d temperatur. Do temperatury \r\n"
              "      dodawany jest offset, a nastepnie jest ona mnozona przez wspolczynnik. \r\n"
              "      Suma wszystkich wazonych temperatur oraz stalego offsetu stanowi \r\n"
              "      przesuniecie krzywej w pionie. Przyklad:\r\n"
              "   \r\n"
              "      <korekcjawyjscia offset=\"3\"> \r\n"
              "          <korekcja tempid=\"reg1\"  mnoznik=\"1.2\" offset=\"3\" /> \r\n"
              "          <korekcja tempid=\"reg2\"  mnoznik=\"1\" offset=\"0\" />   \r\n"
              "      </korekcjawyjscia>\r\n"
              "   \r\n"
              "   -->\r\n", KRZY_MAXKRZYWYCH, KRZY_MAXOPIS, KRZY_MAXTIN, KRZY_MAXODCINKOW,KRZY_MAXTKOR);
      }


      if(pkrzywe->pad==0xBEEF){
		  for(i=0; i<KRZY_MAXDEFINICJIKRZYWYCH; i++){
			  if(pKrzy[i].numer!=0) ZAPKRZ_Krzywa(&pKrzy[i], stream, noComment);
		  }
      }
      return OK;
}

int ZAPKRZ_Krzywa(TKrzKrzywa*  pkrzy, FILE *stream, int noComment)
{
    int i;
    fprintf(stream,"\r\n");
	fprintf(stream,"<krzywa numer=\"%d\" opis=\"%s\" ",
			pkrzy->numer, pkrzy->opis);
	if(pkrzy->program){
	    fprintf(stream,"program=\"%d\" ",pkrzy->program);
	}
	fprintf(stream,">\r\n");

	if(pkrzy->offsettin!=0) fprintf(stream,"   <temperaturywej offset=\"%0.1f\" >\r\n",
			                               (float)pkrzy->offsettin/KRZY_OFFSETWSP);
	else                    fprintf(stream,"   <temperaturywej> \r\n");
    //FOR all temp wej
	for(i=0; i<KRZY_MAXKRZYWYCH; i++){
  	    if(pkrzy->tin[i].tIdx!=TEMPDEF_INVALID_IDX){
		fprintf(stream,"     <temperaturawej tempid=\"%s\" mnoznik=\"%0.3f\" offset=\"%0.1f\" /> \r\n",
						      TEMP_getTempIdxStr(pkrzy->tin[i].tIdx),
							  (float)(pkrzy->tin[i].wsp.A)/KRZY_MNOZNIKWSP,
							  (float)(pkrzy->tin[i].wsp.B)/KRZY_OFFSETWSP);
  	    }
    }
    //ENDFOR all temp wej
  	fprintf(stream,"   </temperaturywej> \r\n");
    fprintf(stream,"\r\n");
  	fprintf(stream,"   <funkcja> \r\n");
    //FOR all temp wej
	for(i=0; i<KRZY_MAXODCINKOW; i++){
  	    if(pkrzy->punkty[i].tin!=-999){
			fprintf(stream,"     <punkt  tempwej=\"%0.1f\" tempwyj=\"%0.1f\" ",
								  (float)(pkrzy->punkty[i].tin)/10,
								  (float)(pkrzy->punkty[i].tout)/10);
		    fprintf(stream,"/>\r\n");
  	    }else{
  	    	break;
  	    }
    }
    //ENDFOR all temp wej
  	fprintf(stream,"   </funkcja> \r\n");
    fprintf(stream,"\r\n");
	if(pkrzy->offsetkorekcja!=0) fprintf(stream,"   <korekcjawyjscia offset=\"%0.1f\" >\r\n",
			                             (float)pkrzy->offsetkorekcja/KRZY_OFFSETWSP);
	else                         fprintf(stream,"   <korekcjawyjscia> \r\n");
	for(i=0; i<KRZY_MAXTKOR; i++){
       if(pkrzy->tkor[i].tIdx!=TEMPDEF_INVALID_IDX){
            fprintf(stream,"     <korekcja tempid=\"%s\"",TEMP_getTempIdxStr(pkrzy->tkor[i].tIdx));
            fprintf(stream," mnoznik=\"%0.3f\"",(float)pkrzy->tkor[i].wsp.A/KRZY_MNOZNIKWSP);
            fprintf(stream," offset=\"%0.1f\"",(float)pkrzy->tkor[i].wsp.B/KRZY_OFFSETWSP);
            fprintf(stream," />\r\n");
       }
	}
    fprintf(stream,"   </korekcjawyjscia>\r\n");

    fprintf(stream,"\r\n");
    fprintf(stream,"</krzywa>\r\n");
    return OK;
}





